package com.example.keshe;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.application.Platform;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Optional;

/**
 * 主类，用于启动JavaFX应用程序和处理用户登录逻辑。
 */
public class MainApp extends Application {

    /**
     * 主方法，启动JavaFX应用程序。
     *
     * @param args 命令行参数。
     */
    public static void main(String[] args) {
        launch(args);
    }

    /**
     * JavaFX应用程序的启动方法，创建登录对话框并处理用户登录逻辑。
     *
     * @param stage JavaFX舞台对象。
     */
    @Override
    public void start(Stage stage) {
        // 创建登录对话框
        Dialog<ButtonType> dialog = new Dialog<>();
        dialog.setTitle("请管理员进行登录");
        dialog.setHeaderText("输入账号和密码");
        // 设置对话框大小
        dialog.setWidth(400);
        dialog.setHeight(200);
        // 创建文本框和密码框
        TextField usernameField = new TextField();
        PasswordField passwordField = new PasswordField();
        // 设置文本框和密码框的最小宽度和最大宽度，并将内容居中
        usernameField.setMinWidth(200);
        usernameField.setMaxWidth(200);
        passwordField.setMinWidth(200);
        passwordField.setMaxWidth(200);
        // 创建布局并添加一些空白
        GridPane grid = new GridPane();
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new javafx.geometry.Insets(20, 20, 20, 20)); // 上、右、下、左
        Label usernameLabel = new Label("账号:");
        Label passwordLabel = new Label("密码:");
        grid.add(usernameLabel, 0, 0);
        grid.add(usernameField, 1, 0);
        grid.add(passwordLabel, 0, 1);
        grid.add(passwordField, 1, 1);
        // 设置GridPane在对话框内居中
        grid.setAlignment(Pos.CENTER);
        // 设置标签文本左对齐
        GridPane.setHalignment(usernameLabel, javafx.geometry.HPos.LEFT);
        GridPane.setHalignment(passwordLabel, javafx.geometry.HPos.LEFT);
        dialog.getDialogPane().setContent(grid);
        // 添加OK和Cancel按钮
        dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
        // 确保OK按钮在输入合法时可用
        dialog.getDialogPane().lookupButton(ButtonType.OK).setDisable(true);
        // 监听文本框和密码框的变化
        usernameField.textProperty().addListener((observable, oldValue, newValue) ->
                dialog.getDialogPane().lookupButton(ButtonType.OK).setDisable(newValue.trim().isEmpty()));
        passwordField.textProperty().addListener((observable, oldValue, newValue) ->
                dialog.getDialogPane().lookupButton(ButtonType.OK).setDisable(newValue.trim().isEmpty()));
        // 请求焦点
        Platform.runLater(usernameField::requestFocus);
        // 显示对话框并等待用户响应
        Optional<ButtonType> result = dialog.showAndWait();
        // 检查用户输入是否满足条件
        if (result.isPresent() && result.get() == ButtonType.OK
                && isValidUser(usernameField.getText(), passwordField.getText())) {
            // 如果验证成功，加载主视图
            try {
                Parent parent = FXMLLoader.load(getClass().getResource("MainView.fxml"));
                Scene scene = new Scene(parent);
                stage.setScene(scene);
                stage.setTitle("服装信息管理系统设计与实现");
                stage.show();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else if (result.isPresent() && result.get() == ButtonType.CANCEL) {
            // 如果用户点击了取消按钮，退出系统
            Platform.exit();
            System.exit(0);
        } else {
            // 如果验证失败，显示错误并重新调用start
            Alert errorAlert = new Alert(Alert.AlertType.ERROR, "账号或密码错误。请重试。", ButtonType.OK);
            errorAlert.showAndWait();
            start(stage);
        }
    }

    /**
     * 验证用户的方法。连接数据库并检查是否存在匹配的用户记录。
     *
     * @param enteredUsername 用户输入的账号。
     * @param enteredPassword 用户输入的密码。
     * @return 如果存在匹配的用户记录，返回true；否则返回false。
     */
    private boolean isValidUser(String enteredUsername, String enteredPassword) {
        // 在这里实现验证用户的逻辑，连接数据库并检查是否存在匹配的用户记录
        // 这只是一个简单的示例，实际上应该使用连接池、防止SQL注入等更安全的做法
        String jdbcUrl = "jdbc:mysql://localhost:3306/db_library";
        String dbUsername = "root";
        String dbPassword = "123456";
        try (Connection connection = DriverManager.getConnection(jdbcUrl, dbUsername, dbPassword)) {
            String query = "SELECT * FROM user WHERE username = ? AND password = ?";
            try (PreparedStatement preparedStatement = connection.prepareStatement(query)) {
                preparedStatement.setString(1, enteredUsername);
                preparedStatement.setString(2, enteredPassword);

                try (ResultSet resultSet = preparedStatement.executeQuery()) {
                    return resultSet.next(); // 如果存在匹配的用户记录，返回 true
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }
}
